home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Scene Storm
/
Scene Storm - Volume 1.iso
/
coding
/
asm
/
games
/
spritegrabber
/
grabber
/
iff.s
< prev
next >
Wrap
Text File
|
1980-01-03
|
11KB
|
555 lines
init_editor_screen
move.l editscreenB,a0
move.l editscreenA,a1
move.l #((40*200)*8)-1,d7
.loop clr.b (a0)+
clr.b (a1)+
dbra d7,.loop
move.l #0,iff_screen_size
move.l #0,iff_masksize
move.l #0,iff_maskscreen
move.l #0,iff_screen
rts
;---------------------------------------------
set_iff_screen
cmp.l #0,iff_screen
bne.s .iff
move.l #0,screenXpos
move.l #0,screenYpos
move.l #40*8,iff_nextline
move.l #320,iff_width_pixels
move.l #40,iff_width
move.l #8,iff_depth
move.l #200,iff_height
move.l editscreenB,a0
bsr create_dum_iff_table
move.l editscreenB,d0
bra set_dum_iff
.iff move.l iff_Screen,d0
add.l screenXpos,d0
move.l iff_nextline,d3
mulu.l screenYpos,d3
add.l d3,d0
set_dum_iff
move.l iff_width,d1
move.l d1,d2
moveq.l #8-1,d7
lea grab_planes,a0
.loop move.w d0,6(a0)
swap d0
move.w d0,2(a0)
swap d0
add.l d1,d0
addq.l #8,a0
dbra d7,.loop
move.l iff_depth,d1
add.l iff_stencil,d1
cmp.l #8,d1
bge.s .a1
addq.l #1,d1
.a1 mulu d1,d2
sub.w #40,d2
move.w d2,grab_modulo+2
move.w d2,grab_modulo+6
move.l iff_depth,d1
cmp.l #8,d1
beq.s .a
add.l #1,d1
.a lea grab_display_table,a0
move.w (a0,d1.w*2),grab_display+2
rts
grab_display_table
dc.w $0201,$1201,$2201,$3201,$4201,$5201,$6201,$7201,$0211
;---------------------------------------------
search_txt cmp.l (a2),d6
beq.s .found_ok
addq.l #2,a2
subq.l #2,d7
bpl.s search_txt
moveq #-1,d7
rts
.found_ok addq.l #4,a2
subq.l #4,d7
rts
;---------------------------------------------
check_iff_lbm_file
move.l iff_address,a2
cmp.l #'FORM',(a2)
beq.s .okayFORM
move.w #2,status_mode
rts
.okayFORM move.l #1,iff_flags
move.l #'ILBM',d6
move.l iff_address,a2
move.l iff_length,d7
bsr search_txt
tst.l d7
bpl.s .okayILBM
move.l #2,iff_flags
move.l #'PBM ',d6
move.l iff_address,a2
move.l iff_length,d7
bsr search_txt
tst.l d7
bpl.s .okayILBM
; ERROR NO HEADER
move.w #3,status_mode
rts
;---------------------------------------------
.okayILBM move.l #'BMHD',d6
move.l iff_address,a2
move.l iff_length,d7
bsr search_txt
tst.l d7
bpl.s .okayBMHD
move.w #4,status_mode
rts
;---------------------------------------------
.okayBMHD addq.l #4,a2
moveq.l #0,d0
move.w (a2)+,d0
move.l d0,iff_width_pixels
move.w (a2)+,d0
move.l d0,iff_height
addq.l #4,a2
moveq.l #0,d2
move.b (a2),d2
move.l d2,iff_depth
moveq.l #0,d2
move.b 1(a2),d2
cmp.l #1,d2
beq.s .stencil
moveq.l #0,d2
.stencil move.l d2,iff_stencil
moveq.l #0,d2
move.b 2(a2),d2
move.l d2,iff_compression
;---------------------------------------------
move.l #'CMAP',d6
move.l iff_address,a2
move.l iff_length,d7
bsr search_txt
tst.l d7
bpl.s .okayCMAP
move.w #5,status_mode
rts
;---------------------------------------------
.okayCMAP lea iff_palette,a3
move.l #256-1,d7
.loopCMAP2 move.b #$ff,(a3)+
move.b #$ff,(a3)+
move.b #$ff,(a3)+
dbra d7,.loopCMAP2
move.l iff_depth,d0
subq.l #1,d0
moveq.l #0,d7
move.b (.iff_colourindex,d0.w),d7
move.l d7,iff_colours
moveq.l #0,d0
addq.l #4,a2
lea iff_palette,a3
.CMAPloop move.b (a2)+,(a3)+
move.b (a2)+,(a3)+
move.b (a2)+,(a3)+
dbra d7,.CMAPloop
rts
.iff_colourindex dc.b 1,3,7,15,31,63,127,255
;---------------------------------------------
alloc_iff_file
move.l iff_screen_size,d0
move.l #$10002,d1
LIB allocmem,exec
tst.l d0
beq.s .error
move.l d0,iff_screen
moveq.l #0,d7
rts
.error move.w #6,status_mode
moveq.l #-1,d7
rts
;---------------------------------------------
alloc_mask_screen
move.l iff_masksize,d0
move.l #$10001,d1
LIB allocmem,exec
tst.l d0
beq.s .error2
move.l d0,iff_maskscreen
moveq.l #0,d7
rts
.error2 move.w #9,status_mode
moveq.l #-1,d7
rts
;---------------------------------------------
free_iff_file
cmp.l #0,iff_screen
beq.s .out
move.l iff_screen,a1
move.l iff_screen_size,d0
LIB freemem,exec
move.l #0,iff_Screen
.out rts
;---------------------------------------------
free_mask_screen
cmp.l #0,iff_maskscreen
beq.s .out2
move.l iff_maskscreen,a1
move.l iff_masksize,d0
LIB freemem,exec
move.l #0,iff_maskscreen
.out2 rts
;---------------------------------------------
get_iff_size
move.l iff_width_pixels,d0
move.l iff_height,d1
move.l iff_depth,d2
add.l iff_stencil,d2
lsr.w #3,d0
btst #0,d0
beq.s .a
add.l #1,d0
.a move.l d0,iff_width
mulu.l d1,d0
mulu.l d2,d0
move.l d0,iff_screen_size
move.l iff_depth,d0
add.l iff_stencil,d0
cmp.l #8,d0
bge.s .past
addq.l #1,d0
.past move.l iff_width,d1
mulu d0,d1
move.l d1,iff_nextline
move.l iff_height,d1
move.l iff_width,d0
mulu d0,d1
move.l d1,iff_planesize
move.l d1,iff_masksize
rts
;---------------------------------------------
decode_iff bsr alloc_iff_file
tst.l d7
beq.s .okayALLOC
rts
.okayALLOC move.l #'BODY',d6
move.l iff_address,a2
move.l iff_length,d7
bsr search_txt
tst.l d7
bpl.s .okayBODY
move.w #7,status_mode
rts
.okayBODY move.l iff_screen,a1
tst.l iff_compression
bne.s .compressed
bsr no_compression
rts
.compressed
bsr run_length_decode
.outy rts
;---------------------------------------------
checkflags cmp.l #1,iff_stencil
beq .next
cmp.l #8,iff_depth
beq .next
;---------------------------------------------
move.l iff_screen_size,d0
add.l iff_planesize,d0
move.l d0,iff_pulse_size
move.l #$10002,d1
LIB allocmem,exec
move.l d0,iff_pulse_screen
;---------------------------------------------
move.l iff_screen,a0
move.l iff_pulse_screen,a1
move.l iff_width,d0
move.l iff_height,d7
subq.l #1,d7
.loop1 move.l iff_nextline,d1
sub.l iff_width,d1
subq.l #1,d1
.loop move.b (a0)+,(a1)+
dbra d1,.loop
add.l d0,a1
dbra d7,.loop1
;---------------------------------------------
move.l iff_screen,a1
move.l iff_screen_size,d0
move.l a1,a0
move.l d0,d1
LIB freemem,exec
;---------------------------------------------
move.l iff_pulse_screen,iff_screen
move.l iff_pulse_size,iff_screen_size
move.l #0,iff_pulse_screen
;---------------------------------------------
.next cmp.l #2,iff_flags
bne.s .out
move.l iff_screen_size,d0
move.l #$10002,d1
LIB allocmem,exec
move.l d0,iff_pc_screen
bsr convert_chunky
move.l iff_screen,a1
move.l iff_screen_size,d0
move.l a1,a0
move.l d0,d1
LIB freemem,exec
move.l iff_pc_screen,iff_screen
.out rts
;---------------------------------------------
no_compression
move.l (a2)+,d0
.cloop move.b (a2)+,(a1)+
subq.l #1,d0
bgt.s .cloop
rts
;---------------------------------------------
run_length_decode
move.l (a2)+,d0
.loop move.b (a2)+,d1
bmi.s .run
.cloop move.b (a2)+,(a1)+
subq.l #1,d0
subq.b #1,d1
bge.s .cloop
subq.l #1,d0
bgt.s .loop
rts
.run move.b (a2)+,d2
.rloop move.b d2,(a1)+
addq.b #1,d1
ble.s .rloop
subq.l #2,d0
bgt.s .loop
rts
;---------------------------------------------
convert_chunky
move.l iff_screen,a0
move.l iff_pc_screen,a1
movem.l d0-d7/a2-a6,-(sp)
move.l #0,d6
move.l #0,d7
move.l iff_width_pixels,d5
lsr.w #3,d5
lea (a1,d5.w),a2
movea.l a2,a3
lea (a1,d5.w*2),a4
lea (a4,d5.w*2),a5
lea (a5,d5.w*2),a6
.mainloop move.l (a0)+,d0
move.l (a0)+,d1
move.l d0,d2
and.l #$0f0f0f0f,d2
eor.l d2,d0
move.l d1,d3
and.l #$0f0f0f0f,d3
eor.l d3,d1
lsl.l #4,d2
or.l d3,d2
lsr.l #4,d1
or.l d1,d0
move.l d2,d3
and.l #$3333cccc,d3
move.w d3,d1
clr.w d3
lsl.l #2,d3
lsr.w #2,d1
or.w d1,d3
swap d2
and.l #$3333cccc,d2
or.l d2,d3
move.l d0,d1
and.l #$3333cccc,d1
move.w d1,d2
clr.w d1
lsl.l #2,d1
lsr.w #2,d2
or.w d2,d1
swap d0
and.l #$3333cccc,d0
or.l d0,d1
move.l d1,d2
lsr.l #7,d2
move.l d1,d0
and.l #$55555555,d0
eor.l d0,d1
move.l d2,d4
and.l #$55555555,d4
eor.l d4,d2
or.l d4,d1
lsr.l #1,d1
move.b d1,(a6,d5.w)
swap d1
move.b d1,(a5,d5.w)
or.l d0,d2
move.b d2,(a6)+
swap d2
move.b d2,(a5)+
move.l d3,d2
lsr.l #7,d2
move.l d3,d0
and.l #$55555555,d0
eor.l d0,d3
move.l d2,d4
and.l #$55555555,d4
eor.l d4,d2
or.l d4,d3
lsr.l #1,d3
move.b d3,(a4,d5.w)
swap d3
move.b d3,(a3)+
or.l d0,d2
move.b d2,(a4)+
swap d2
move.b d2,(a1)+
add.l #1,d6
move.l iff_width_pixels,d0
lsr.w #3,d0
cmp.l d6,d0
bne .mainloop
move.l #8-1,d0
move.l iff_width_pixels,d1
lsr.w #3,d1
mulu.w d0,d1
lea.l (a1,d1.w),a1
lea.l (a1,d5.w),a2
movea.l a2,a3
lea.l (a1,d5.w*2),a4
lea.l (a4,d5.w*2),a5
lea.l (a5,d5.w*2),a6
moveq.l #0,d6
addq.l #1,d7
move.l iff_height,d0
cmp.l d7,d0
bne .mainloop
movem.l (sp)+,d0-d7/a2-a6
rts
;---------------------------------------------
do_iff_palette
lea iff_palette,a0
do_palette lea grab_colours,a2
lea grab_colours_lo,a1
moveq.l #8-1,d7
.loop addq.l #4,a1
addq.l #4,a2
move.l #32-1,d6
.loop1 bsr make_colour
move.w d0,2(a1)
swap d0
move.w d0,2(a2)
addq.l #4,a1
addq.l #4,a2
dbra d6,.loop1
dbra d7,.loop
rts
;---------------------------------------------
make_colour
moveq.l #0,d0
moveq.l #0,d1
moveq.l #0,d2
moveq.l #0,d3
Move.b (a0),d1
Move.b 1(a0),d2
Move.b 2(a0),d3
Moveq #$f,d4
And.w d4,d1
And.w d4,d2
And.w d4,d3
Lsl.w #8,d1
Lsl.w #4,d2
Or.w d1,d2
Or.w d2,d3
Move.w d3,d0
Swap d0
Move.b (a0)+,d1
Move.b (a0)+,d2
Move.b (a0)+,d3
Lsr.w #4,d1
Lsr.w #4,d2
Lsr.w #4,d3
And.w d4,d1
And.w d4,d2
And.w d4,d3
Lsl.w #8,d1
Lsl.w #4,d2
Or.w d1,d2
Or.w d2,d3
Move.w d3,d0
Swap d0
rts
;---------------------------------------------
create_iff_table
move.l iff_width,d0
move.l iff_screen,a0
create_dum_iff_table
lea iff_table,a1
moveq.l #8-1,d7
.loop move.l a0,(a1)+
add.l d0,a0
dbra d7,.loop
rts
;---------------------------------------------
create_mask_screen
bsr alloc_mask_screen
tst.l iff_maskscreen
beq .out
move.l iff_height,d7
subq.l #1,d7
move.l iff_maskscreen,a1
moveq.l #0,d2 ;offset
;---------------------------------------------
.loop1 move.l iff_width,d6
subq.l #1,d6
move.l d2,d1
.loop2 lea iff_table,a0
;---------------------------------------------
move.l iff_depth,d5
subq.w #1,d5
moveq.l #0,d0
.loop3 move.l (a0)+,a2
add.l d1,a2
or.b (a2),d0
dbra d5,.loop3
;---------------------------------------------
move.b d0,(a1)+
addq.l #1,d1
dbra d6,.loop2
;---------------------------------------------
add.l iff_nextline,d2
dbra d7,.loop1
.out rts
;---------------------------------------------
print_screen_size
move.l #1,tcol
move.l #74,d0
move.l #20,d1
move.l iff_width_pixels,d2
moveq.l #4,d3
bsr dec_print
move.l #74,d0
move.l #28,d1
move.l iff_height,d2
moveq.l #4,d3
bsr dec_print
move.l #74,d0
move.l #36,d1
move.l iff_depth,d2
moveq.l #4,d3
bsr dec_print
rts
;---------------------------------------------